Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


Displaying Raw • Download


RNS/Discovery.py HEAD (3535327f) Text, 41.44 KB

Tff7b72import T7ee787os
Tff7b72import T7ee787re
Tff7b72import T7ee787RNS
Tff7b72import T7ee787time
Tff7b72import T7ee787random
Tff7b72import T7ee787threading
Tff7b72import T7ee787ipaddress
Tff7b72import T7ee787subprocess
Tff7b72from T7ee787.T7ee787vendor Tff7b72import Te6edf3umsgpack Tff7b72as Te6edf3msgpack

Te6edf3NAME Tff7b72= T79c0ff0xFF
Te6edf3TRANSPORT_ID Tff7b72= T79c0ff0xFE
Te6edf3INTERFACE_TYPE Tff7b72= T79c0ff0x00
Te6edf3TRANSPORT Tff7b72= T79c0ff0x01
Te6edf3REACHABLE_ON Tff7b72= T79c0ff0x02
Te6edf3LATITUDE Tff7b72= T79c0ff0x03
Te6edf3LONGITUDE Tff7b72= T79c0ff0x04
Te6edf3HEIGHT Tff7b72= T79c0ff0x05
Te6edf3PORT Tff7b72= T79c0ff0x06
Te6edf3IFAC_NETNAME Tff7b72= T79c0ff0x07
Te6edf3IFAC_NETKEY Tff7b72= T79c0ff0x08
Te6edf3FREQUENCY Tff7b72= T79c0ff0x09
Te6edf3BANDWIDTH Tff7b72= T79c0ff0x0A
Te6edf3SPREADINGFACTOR Tff7b72= T79c0ff0x0B
Te6edf3CODINGRATE Tff7b72= T79c0ff0x0C
Te6edf3MODULATION Tff7b72= T79c0ff0x0D
Te6edf3CHANNEL Tff7b72= T79c0ff0x0E

Te6edf3APP_NAME Tff7b72= Ta5d6ff"Ta5d6ffrnstransportTa5d6ff"

Tff7b72class T56d364InterfaceAnnouncerTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3JOB_INTERVAL Tff7b72= T79c0ff60
Te6edf3DEFAULT_STAMP_VALUE Tff7b72= T79c0ff14
Te6edf3WORKBLOCK_EXPAND_ROUNDS Tff7b72= T79c0ff20

Te6edf3DISCOVERABLE_INTERFACE_TYPES Tff7b72= Tb4b4b4[Ta5d6ff"Ta5d6ffBackboneInterfaceTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffTCPServerInterfaceTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffTCPClientInterfaceTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffRNodeInterfaceTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffWeaveInterfaceTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffI2PInterfaceTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffKISSInterfaceTa5d6ff"Tb4b4b4]

Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3ownerTb4b4b4)Tb4b4b4:
Tff7b72import T7ee787importlibT7ee787.T7ee787util
Tff7b72if Te6edf3importlibTff7b72.Td2a8ffutilTff7b72.Td2a8fffind_specTb4b4b4(Ta5d6ff'Ta5d6ffLXMFTa5d6ff'Tb4b4b4) Tff7b72!= Tff7b72NoneTb4b4b4: Tff7b72from T7ee787LXMF Tff7b72import Te6edf3LXStamper
Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffUsing on-network interface discovery requires the LXMF module to be installed.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_CRITICALTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffYou can install it with the command: pip install lxmfTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_CRITICALTb4b4b4)
Te6edf3RNSTff7b72.Td2a8ffpanicTb4b4b4(Tb4b4b4)

Tff7b72selfTff7b72.Td2a8ffowner Tff7b72= Te6edf3owner
Tff7b72selfTff7b72.Td2a8ffshould_run Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffjob_interval Tff7b72= Tff7b72selfTff7b72.Td2a8ffJOB_INTERVAL
Tff7b72selfTff7b72.Td2a8ffstamper Tff7b72= Te6edf3LXStamper
Tff7b72selfTff7b72.Td2a8ffstamp_cache Tff7b72= Tb4b4b4{Tb4b4b4}

Tff7b72if Tff7b72selfTff7b72.Td2a8ffownerTff7b72.Td2a8ffhas_network_identityTb4b4b4(Tb4b4b4)Tb4b4b4: Te6edf3identity Tff7b72= Tff7b72selfTff7b72.Td2a8ffownerTff7b72.Td2a8ffnetwork_identity
Tff7b72elseTb4b4b4: Te6edf3identity Tff7b72= Tff7b72selfTff7b72.Td2a8ffownerTff7b72.Td2a8ffidentity

Tff7b72selfTff7b72.Td2a8ffdiscovery_destination Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTb4b4b4(Te6edf3identityTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffINTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffSINGLETb4b4b4,
Te6edf3APP_NAMETb4b4b4, Ta5d6ff"Ta5d6ffdiscoveryTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffinterfaceTa5d6ff"Tb4b4b4)

Tff7b72def Td2a8ffstartTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffshould_runTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffshould_run Tff7b72= Tff7b72True
Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Tff7b72selfTff7b72.Td2a8ffjobTb4b4b4, Te6edf3daemonTff7b72=Tff7b72TrueTb4b4b4)Tff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ffstopTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffshould_run Tff7b72= Tff7b72False

Tff7b72def Td2a8ffjobTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72while Tff7b72selfTff7b72.Td2a8ffshould_runTb4b4b4:
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(Tff7b72selfTff7b72.Td2a8ffjob_intervalTb4b4b4)
Tff7b72tryTb4b4b4:
Te6edf3now Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Te6edf3due_interfaces Tff7b72= Tb4b4b4[Te6edf3i Tff7b72for Te6edf3i Tff7b72in Tff7b72selfTff7b72.Td2a8ffownerTff7b72.Td2a8ffinterfaces Tff7b72if Te6edf3iTff7b72.Td2a8ffsupports_discovery Tff7b72and Te6edf3iTff7b72.Td2a8ffdiscoverable Tff7b72and Te6edf3now Tff7b72> Tb4b4b4(Te6edf3iTff7b72.Td2a8fflast_discovery_announceTff7b72+Te6edf3iTff7b72.Td2a8ffdiscovery_announce_intervalTb4b4b4)Tb4b4b4]
Te6edf3due_interfacesTff7b72.Td2a8ffsortTb4b4b4(Te6edf3keyTff7b72=Tff7b72lambda Te6edf3iTb4b4b4: Te6edf3nowTff7b72-Te6edf3iTff7b72.Td2a8fflast_discovery_announceTb4b4b4, Te6edf3reverseTff7b72=Tff7b72TrueTb4b4b4)

Tff7b72if Tffa657lenTb4b4b4(Te6edf3due_interfacesTb4b4b4) Tff7b72> T79c0ff0Tb4b4b4:
Te6edf3selected_interface Tff7b72= Te6edf3due_interfacesTb4b4b4[T79c0ff0Tb4b4b4]
Te6edf3selected_interfaceTff7b72.Td2a8fflast_discovery_announce Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffPreparing interface discovery announce for Tffd700{Te6edf3selected_interfaceTff7b72.Td2a8ffnameTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Te6edf3app_data Tff7b72= Tff7b72selfTff7b72.Td2a8ffget_interface_announce_dataTb4b4b4(Te6edf3selected_interfaceTb4b4b4)
Tff7b72if Tff7b72not Te6edf3app_dataTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCould not generate interface discovery announce data for Tffd700{Te6edf3selected_interfaceTff7b72.Td2a8ffnameTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffSending interface discovery announce for Tffd700{Te6edf3selected_interfaceTff7b72.Td2a8ffnameTffd700}Ta5d6ff with Tffd700{Tffa657lenTb4b4b4(Te6edf3app_dataTb4b4b4)Tffd700}Ta5d6ffB payloadTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffdiscovery_destinationTff7b72.Td2a8ffannounceTb4b4b4(Te6edf3app_dataTff7b72=Te6edf3app_dataTb4b4b4)

Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffError while preparing interface discovery announces: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fftrace_exceptionTb4b4b4(Te6edf3eTb4b4b4)

Tff7b72def Td2a8ffsanitizeTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3in_strTb4b4b4)Tb4b4b4:
Te6edf3sanitized Tff7b72= Te6edf3in_strTff7b72.Td2a8ffreplaceTb4b4b4(Ta5d6ff"Tffea00\nTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4)
Te6edf3sanitized Tff7b72= Te6edf3sanitizedTff7b72.Td2a8ffreplaceTb4b4b4(Ta5d6ff"Tffea00\rTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4)
Te6edf3sanitized Tff7b72= Te6edf3sanitizedTff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)
Tff7b72return Te6edf3sanitized

Tff7b72def Td2a8ffget_interface_announce_dataTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3interfaceTb4b4b4)Tb4b4b4:
Te6edf3interface_type Tff7b72= Tffa657typeTb4b4b4(Te6edf3interfaceTb4b4b4)Tff7b72.Td2a8ff__name__
Te6edf3stamp_value Tff7b72= Te6edf3interfaceTff7b72.Td2a8ffdiscovery_stamp_value Tff7b72if Te6edf3interfaceTff7b72.Td2a8ffdiscovery_stamp_value Tff7b72else Tff7b72selfTff7b72.Td2a8ffDEFAULT_STAMP_VALUE

Tff7b72if Tff7b72not Te6edf3interface_type Tff7b72in Tff7b72selfTff7b72.Td2a8ffDISCOVERABLE_INTERFACE_TYPESTb4b4b4: Tff7b72return Tff7b72None
Tff7b72elseTb4b4b4:
Te6edf3flags Tff7b72= T79c0ff0x00
Te6edf3info Tff7b72= Tb4b4b4{Te6edf3INTERFACE_TYPETb4b4b4: Te6edf3interface_typeTb4b4b4,
Te6edf3TRANSPORTTb4b4b4: Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8fftransport_enabledTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3TRANSPORT_IDTb4b4b4: Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffidentityTff7b72.Td2a8ffhashTb4b4b4,
Te6edf3NAMETb4b4b4: Tff7b72selfTff7b72.Td2a8ffsanitizeTb4b4b4(Te6edf3interfaceTff7b72.Td2a8ffdiscovery_nameTb4b4b4)Tb4b4b4,
Te6edf3LATITUDETb4b4b4: Te6edf3interfaceTff7b72.Td2a8ffdiscovery_latitudeTb4b4b4,
Te6edf3LONGITUDETb4b4b4: Te6edf3interfaceTff7b72.Td2a8ffdiscovery_longitudeTb4b4b4,
Te6edf3HEIGHTTb4b4b4: Te6edf3interfaceTff7b72.Td2a8ffdiscovery_heightTb4b4b4}

Tff7b72if Te6edf3interface_type Tff7b72== Ta5d6ff"Ta5d6ffTCPClientInterfaceTa5d6ff" Tff7b72and Tff7b72not Te6edf3interfaceTff7b72.Td2a8ffkiss_framingTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffInvalid interface discovery configuration for Tffd700{Te6edf3interfaceTffd700}Ta5d6ff, aborting discovery announceTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72return Tff7b72None

Tff7b72if Te6edf3interface_type Tff7b72in Tb4b4b4[Ta5d6ff"Ta5d6ffBackboneInterfaceTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffTCPServerInterfaceTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3reachable_on Tff7b72= Tff7b72selfTff7b72.Td2a8ffsanitizeTb4b4b4(Te6edf3interfaceTff7b72.Td2a8ffreachable_onTb4b4b4)

Tff7b72if Tff7b72not Te6edf3RNSTff7b72.Td2a8ffvendorTff7b72.Td2a8ffplatformutilsTff7b72.Td2a8ffis_windowsTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3exec_path Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffexpanduserTb4b4b4(Te6edf3reachable_onTb4b4b4)
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3exec_pathTb4b4b4) Tff7b72and Te6edf3osTff7b72.Td2a8ffaccessTb4b4b4(Te6edf3exec_pathTb4b4b4, Te6edf3osTff7b72.Td2a8ffX_OKTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffEvaluating reachable_on from executable at Tffd700{Te6edf3exec_pathTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Te6edf3exec_result Tff7b72= Te6edf3subprocessTff7b72.Td2a8ffrunTb4b4b4(Tb4b4b4[Te6edf3exec_pathTb4b4b4]Tb4b4b4, Te6edf3stdoutTff7b72=Te6edf3subprocessTff7b72.Td2a8ffPIPETb4b4b4)
Te6edf3exec_stdout Tff7b72= Te6edf3exec_resultTff7b72.Td2a8ffstdoutTff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Tff7b72if Te6edf3exec_resultTff7b72.Td2a8ffreturncode Tff7b72!= T79c0ff0Tb4b4b4: Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffNon-zero exit code from subprocessTa5d6ff"Tb4b4b4)
Te6edf3reachable_on Tff7b72= Tff7b72selfTff7b72.Td2a8ffsanitizeTb4b4b4(Te6edf3exec_stdoutTb4b4b4)
Tff7b72if Tff7b72not Tb4b4b4(Te6edf3is_ip_addressTb4b4b4(Te6edf3reachable_onTb4b4b4) Tff7b72or Te6edf3is_hostnameTb4b4b4(Te6edf3reachable_onTb4b4b4)Tb4b4b4)Tb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffValid IP address or hostname was not found in external script output Tffea00\"Tffd700{Te6edf3reachable_onTffd700}Tffea00\"Ta5d6ff"Tb4b4b4)

Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffError while getting reachable_on from executable at Tffd700{Te6edf3interfaceTff7b72.Td2a8ffreachable_onTffd700}Ta5d6ff: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffAborting discovery announceTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72return Tff7b72None

Tff7b72if Tff7b72not Tb4b4b4(Te6edf3is_ip_addressTb4b4b4(Te6edf3reachable_onTb4b4b4) Tff7b72or Te6edf3is_hostnameTb4b4b4(Te6edf3reachable_onTb4b4b4)Tb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffThe configured reachable_on parameter Tffea00\"Tffd700{Te6edf3reachable_onTffd700}Tffea00\"Ta5d6ff for Tffd700{Te6edf3interfaceTffd700}Ta5d6ff is not a valid IP address or hostnameTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffAborting discovery announceTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72return Tff7b72None

Te6edf3infoTb4b4b4[Te6edf3REACHABLE_ONTb4b4b4] Tff7b72= Te6edf3reachable_on
Te6edf3infoTb4b4b4[Te6edf3PORTTb4b4b4] Tff7b72= Te6edf3interfaceTff7b72.Td2a8ffbind_port

Tff7b72if Te6edf3interface_type Tff7b72== Ta5d6ff"Ta5d6ffI2PInterfaceTa5d6ff" Tff7b72and Te6edf3interfaceTff7b72.Td2a8ffconnectable Tff7b72and Te6edf3interfaceTff7b72.Td2a8ffb32Tb4b4b4:
Te6edf3infoTb4b4b4[Te6edf3REACHABLE_ONTb4b4b4] Tff7b72= Te6edf3interfaceTff7b72.Td2a8ffb32

Tff7b72if Te6edf3interface_type Tff7b72== Ta5d6ff"Ta5d6ffRNodeInterfaceTa5d6ff"Tb4b4b4:
Te6edf3infoTb4b4b4[Te6edf3FREQUENCYTb4b4b4] Tff7b72= Te6edf3interfaceTff7b72.Td2a8fffrequency
Te6edf3infoTb4b4b4[Te6edf3BANDWIDTHTb4b4b4] Tff7b72= Te6edf3interfaceTff7b72.Td2a8ffbandwidth
Te6edf3infoTb4b4b4[Te6edf3SPREADINGFACTORTb4b4b4] Tff7b72= Te6edf3interfaceTff7b72.Td2a8ffsf
Te6edf3infoTb4b4b4[Te6edf3CODINGRATETb4b4b4] Tff7b72= Te6edf3interfaceTff7b72.Td2a8ffcr

Tff7b72if Te6edf3interface_type Tff7b72== Ta5d6ff"Ta5d6ffWeaveInterfaceTa5d6ff"Tb4b4b4:
Te6edf3infoTb4b4b4[Te6edf3FREQUENCYTb4b4b4] Tff7b72= Te6edf3interfaceTff7b72.Td2a8ffdiscovery_frequency
Te6edf3infoTb4b4b4[Te6edf3BANDWIDTHTb4b4b4] Tff7b72= Te6edf3interfaceTff7b72.Td2a8ffdiscovery_bandwidth
Te6edf3infoTb4b4b4[Te6edf3CHANNELTb4b4b4] Tff7b72= Te6edf3interfaceTff7b72.Td2a8ffdiscovery_channel
Te6edf3infoTb4b4b4[Te6edf3MODULATIONTb4b4b4] Tff7b72= Te6edf3interfaceTff7b72.Td2a8ffdiscovery_modulation

Tff7b72if Te6edf3interface_type Tff7b72== Ta5d6ff"Ta5d6ffKISSInterfaceTa5d6ff" Tff7b72or Tb4b4b4(Te6edf3interface_type Tff7b72== Ta5d6ff"Ta5d6ffTCPClientInterfaceTa5d6ff" Tff7b72and Te6edf3interfaceTff7b72.Td2a8ffkiss_framingTb4b4b4)Tb4b4b4:
Te6edf3infoTb4b4b4[Te6edf3INTERFACE_TYPETb4b4b4] Tff7b72= Ta5d6ff"Ta5d6ffKISSInterfaceTa5d6ff"
Te6edf3infoTb4b4b4[Te6edf3FREQUENCYTb4b4b4] Tff7b72= Te6edf3interfaceTff7b72.Td2a8ffdiscovery_frequency
Te6edf3infoTb4b4b4[Te6edf3BANDWIDTHTb4b4b4] Tff7b72= Te6edf3interfaceTff7b72.Td2a8ffdiscovery_bandwidth
Te6edf3infoTb4b4b4[Te6edf3MODULATIONTb4b4b4] Tff7b72= Tff7b72selfTff7b72.Td2a8ffsanitizeTb4b4b4(Te6edf3interfaceTff7b72.Td2a8ffdiscovery_modulationTb4b4b4)

Tff7b72if Te6edf3interfaceTff7b72.Td2a8ffdiscovery_publish_ifac Tff7b72== Tff7b72TrueTb4b4b4:
Te6edf3infoTb4b4b4[Te6edf3IFAC_NETNAMETb4b4b4] Tff7b72= Tff7b72selfTff7b72.Td2a8ffsanitizeTb4b4b4(Te6edf3interfaceTff7b72.Td2a8ffifac_netnameTb4b4b4)
Te6edf3infoTb4b4b4[Te6edf3IFAC_NETKEYTb4b4b4] Tff7b72= Tff7b72selfTff7b72.Td2a8ffsanitizeTb4b4b4(Te6edf3interfaceTff7b72.Td2a8ffifac_netkeyTb4b4b4)

Te6edf3packed Tff7b72= Te6edf3msgpackTff7b72.Td2a8ffpackbTb4b4b4(Te6edf3infoTb4b4b4)
Te6edf3infohash Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffull_hashTb4b4b4(Te6edf3packedTb4b4b4)

Tff7b72if Te6edf3infohash Tff7b72in Tff7b72selfTff7b72.Td2a8ffstamp_cacheTb4b4b4: Te6edf3stamp Tff7b72= Tff7b72selfTff7b72.Td2a8ffstamp_cacheTb4b4b4[Te6edf3infohashTb4b4b4]
Tff7b72elseTb4b4b4: Te6edf3stampTb4b4b4, Te6edf3v Tff7b72= Tff7b72selfTff7b72.Td2a8ffstamperTff7b72.Td2a8ffgenerate_stampTb4b4b4(Te6edf3infohashTb4b4b4, Te6edf3stamp_costTff7b72=Te6edf3stamp_valueTb4b4b4, Te6edf3expand_roundsTff7b72=Tff7b72selfTff7b72.Td2a8ffWORKBLOCK_EXPAND_ROUNDSTb4b4b4)
Tff7b72if Tff7b72not Te6edf3stampTb4b4b4: Tff7b72return Tff7b72None
Tff7b72elseTb4b4b4: Tff7b72selfTff7b72.Td2a8ffstamp_cacheTb4b4b4[Te6edf3infohashTb4b4b4] Tff7b72= Te6edf3stamp

Tff7b72if Te6edf3interfaceTff7b72.Td2a8ffdiscovery_encryptTb4b4b4:
Te6edf3flags Tff7b72|Tff7b72= Te6edf3InterfaceAnnounceHandlerTff7b72.Td2a8ffFLAG_ENCRYPTED
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffownerTff7b72.Td2a8ffhas_network_identityTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffDiscovery encryption requested for Tffd700{Te6edf3interfaceTffd700}Ta5d6ff, but no network identity configured. Aborting discovery announce.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72return Tff7b72None
Tff7b72elseTb4b4b4: Te6edf3payload Tff7b72= Tff7b72selfTff7b72.Td2a8ffownerTff7b72.Td2a8ffnetwork_identityTff7b72.Td2a8ffencryptTb4b4b4(Te6edf3packedTff7b72+Te6edf3stampTb4b4b4)
Tff7b72elseTb4b4b4: Te6edf3payload Tff7b72= Te6edf3packedTff7b72+Te6edf3stamp

Tff7b72return Tffa657bytesTb4b4b4(Tb4b4b4[Te6edf3flagsTb4b4b4]Tb4b4b4)Tff7b72+Te6edf3payload

Tff7b72class T56d364InterfaceAnnounceHandlerTb4b4b4:
Te6edf3FLAG_SIGNED Tff7b72= T79c0ff0b00000001
Te6edf3FLAG_ENCRYPTED Tff7b72= T79c0ff0b00000010

Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3required_valueTff7b72=Te6edf3InterfaceAnnouncerTff7b72.Td2a8ffDEFAULT_STAMP_VALUETb4b4b4, Te6edf3callbackTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72import T7ee787importlibT7ee787.T7ee787util
Tff7b72if Te6edf3importlibTff7b72.Td2a8ffutilTff7b72.Td2a8fffind_specTb4b4b4(Ta5d6ff'Ta5d6ffLXMFTa5d6ff'Tb4b4b4) Tff7b72!= Tff7b72NoneTb4b4b4: Tff7b72from T7ee787LXMF Tff7b72import Te6edf3LXStamper
Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffUsing on-network interface discovery requires the LXMF module to be installed.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_CRITICALTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffYou can install it with the command: pip install lxmfTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_CRITICALTb4b4b4)
Te6edf3RNSTff7b72.Td2a8ffpanicTb4b4b4(Tb4b4b4)

Tff7b72selfTff7b72.Td2a8ffaspect_filter Tff7b72= Te6edf3APP_NAMETff7b72+Ta5d6ff"Ta5d6ff.discovery.interfaceTa5d6ff"
Tff7b72selfTff7b72.Td2a8ffrequired_value Tff7b72= Te6edf3required_value
Tff7b72selfTff7b72.Td2a8ffcallback Tff7b72= Te6edf3callback
Tff7b72selfTff7b72.Td2a8ffstamper Tff7b72= Te6edf3LXStamper

Tff7b72def Td2a8ffreceived_announceTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3destination_hashTb4b4b4, Te6edf3announced_identityTb4b4b4, Te6edf3app_dataTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3discovery_sources Tff7b72= Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffinterface_discovery_sourcesTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3discovery_sources Tff7b72and Tff7b72not Te6edf3announced_identityTff7b72.Td2a8ffhash Tff7b72in Te6edf3discovery_sourcesTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffInterface discovered from non-authorized network identity Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3announced_identityTff7b72.Td2a8ffhashTb4b4b4)Tffd700}Ta5d6ff, ignoringTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72return

Tff7b72if Te6edf3app_data Tff7b72and Tffa657lenTb4b4b4(Te6edf3app_dataTb4b4b4) Tff7b72> Tff7b72selfTff7b72.Td2a8ffstamperTff7b72.Td2a8ffSTAMP_SIZETff7b72+T79c0ff1Tb4b4b4:
Te6edf3flags Tff7b72= Te6edf3app_dataTb4b4b4[T79c0ff0Tb4b4b4]
Te6edf3app_data Tff7b72= Te6edf3app_dataTb4b4b4[T79c0ff1Tb4b4b4:Tb4b4b4]
Te6edf3signed Tff7b72= Te6edf3flags Tff7b72& Tff7b72selfTff7b72.Td2a8ffFLAG_SIGNED
Te6edf3encrypted Tff7b72= Te6edf3flags Tff7b72& Tff7b72selfTff7b72.Td2a8ffFLAG_ENCRYPTED

Tff7b72if Te6edf3encryptedTb4b4b4:
Tff7b72if Tff7b72not Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffhas_network_identityTb4b4b4(Tb4b4b4)Tb4b4b4: Tff7b72return
Te6edf3app_data Tff7b72= Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffnetwork_identityTff7b72.Td2a8ffdecryptTb4b4b4(Te6edf3app_dataTb4b4b4)
Tff7b72if Tff7b72not Te6edf3app_dataTb4b4b4: Tff7b72return

Te6edf3stamp Tff7b72= Te6edf3app_dataTb4b4b4[Tff7b72-Tff7b72selfTff7b72.Td2a8ffstamperTff7b72.Td2a8ffSTAMP_SIZETb4b4b4:Tb4b4b4]
Te6edf3packed Tff7b72= Te6edf3app_dataTb4b4b4[Tb4b4b4:Tff7b72-Tff7b72selfTff7b72.Td2a8ffstamperTff7b72.Td2a8ffSTAMP_SIZETb4b4b4]
Te6edf3infohash Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffull_hashTb4b4b4(Te6edf3packedTb4b4b4)
Te6edf3workblock Tff7b72= Tff7b72selfTff7b72.Td2a8ffstamperTff7b72.Td2a8ffstamp_workblockTb4b4b4(Te6edf3infohashTb4b4b4, Te6edf3expand_roundsTff7b72=Te6edf3InterfaceAnnouncerTff7b72.Td2a8ffWORKBLOCK_EXPAND_ROUNDSTb4b4b4)
Te6edf3value Tff7b72= Tff7b72selfTff7b72.Td2a8ffstamperTff7b72.Td2a8ffstamp_valueTb4b4b4(Te6edf3workblockTb4b4b4, Te6edf3stampTb4b4b4)
Te6edf3valid Tff7b72= Tff7b72selfTff7b72.Td2a8ffstamperTff7b72.Td2a8ffstamp_validTb4b4b4(Te6edf3stampTb4b4b4, Tff7b72selfTff7b72.Td2a8ffrequired_valueTb4b4b4, Te6edf3workblockTb4b4b4)

Tff7b72if Tff7b72not Te6edf3validTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffIgnored discovered interface with invalid stampTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72return

Tff7b72if Te6edf3value Tff7b72< Tff7b72selfTff7b72.Td2a8ffrequired_valueTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffIgnored discovered interface with stamp value Tffd700{Te6edf3valueTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3info Tff7b72= Tff7b72None
Te6edf3unpacked Tff7b72= Te6edf3msgpackTff7b72.Td2a8ffunpackbTb4b4b4(Te6edf3packedTb4b4b4)
Tff7b72if Te6edf3INTERFACE_TYPE Tff7b72in Te6edf3unpackedTb4b4b4:
Te6edf3interface_type Tff7b72= Te6edf3unpackedTb4b4b4[Te6edf3INTERFACE_TYPETb4b4b4]
Te6edf3info Tff7b72= Tb4b4b4{Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4: Te6edf3interface_typeTb4b4b4,
Ta5d6ff"Ta5d6fftransportTa5d6ff"Tb4b4b4: Te6edf3unpackedTb4b4b4[Te6edf3TRANSPORTTb4b4b4]Tb4b4b4,
Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Te6edf3unpackedTb4b4b4[Te6edf3NAMETb4b4b4] Tff7b72or Ta5d6fffTa5d6ff"Ta5d6ffDiscovered Tffd700{Te6edf3interface_typeTffd700}Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffreceivedTa5d6ff"Tb4b4b4: Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffstampTa5d6ff"Tb4b4b4: Te6edf3stampTb4b4b4,
Ta5d6ff"Ta5d6ffvalueTa5d6ff"Tb4b4b4: Te6edf3valueTb4b4b4,
Ta5d6ff"Ta5d6fftransport_idTa5d6ff"Tb4b4b4: Te6edf3RNSTff7b72.Td2a8ffhexrepTb4b4b4(Te6edf3unpackedTb4b4b4[Te6edf3TRANSPORT_IDTb4b4b4]Tb4b4b4, Te6edf3delimitTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffnetwork_idTa5d6ff"Tb4b4b4: Te6edf3RNSTff7b72.Td2a8ffhexrepTb4b4b4(Te6edf3announced_identityTff7b72.Td2a8ffhashTb4b4b4, Te6edf3delimitTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffhopsTa5d6ff"Tb4b4b4: Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffhops_toTb4b4b4(Te6edf3destination_hashTb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6fflatitudeTa5d6ff"Tb4b4b4: Te6edf3unpackedTb4b4b4[Te6edf3LATITUDETb4b4b4]Tb4b4b4,
Ta5d6ff"Ta5d6fflongitudeTa5d6ff"Tb4b4b4: Te6edf3unpackedTb4b4b4[Te6edf3LONGITUDETb4b4b4]Tb4b4b4,
Ta5d6ff"Ta5d6ffheightTa5d6ff"Tb4b4b4: Te6edf3unpackedTb4b4b4[Te6edf3HEIGHTTb4b4b4]Tb4b4b4}

Tff7b72if Te6edf3REACHABLE_ON Tff7b72in Te6edf3unpackedTb4b4b4:
Tff7b72if Tff7b72not Tb4b4b4(Te6edf3is_ip_addressTb4b4b4(Te6edf3unpackedTb4b4b4[Te6edf3REACHABLE_ONTb4b4b4]Tb4b4b4) Tff7b72or Te6edf3is_hostnameTb4b4b4(Te6edf3unpackedTb4b4b4[Te6edf3REACHABLE_ONTb4b4b4]Tb4b4b4)Tb4b4b4)Tb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffInvalid data in reachable_on field of announceTa5d6ff"Tb4b4b4)

Tff7b72if Te6edf3IFAC_NETNAME Tff7b72in Te6edf3unpackedTb4b4b4: Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffifac_netnameTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3unpackedTb4b4b4[Te6edf3IFAC_NETNAMETb4b4b4]
Tff7b72if Te6edf3IFAC_NETKEY Tff7b72in Te6edf3unpackedTb4b4b4: Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffifac_netkeyTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3unpackedTb4b4b4[Te6edf3IFAC_NETKEYTb4b4b4]

Tff7b72if Te6edf3interface_type Tff7b72in Tb4b4b4[Ta5d6ff"Ta5d6ffBackboneInterfaceTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffTCPServerInterfaceTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3backbone_support Tff7b72= Tff7b72not Te6edf3RNSTff7b72.Td2a8ffvendorTff7b72.Td2a8ffplatformutilsTff7b72.Td2a8ffis_windowsTb4b4b4(Tb4b4b4)
Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffreachable_onTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3unpackedTb4b4b4[Te6edf3REACHABLE_ONTb4b4b4]
Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffportTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3unpackedTb4b4b4[Te6edf3PORTTb4b4b4]
Te6edf3connection_interface Tff7b72= Ta5d6ff"Ta5d6ffBackboneInterfaceTa5d6ff" Tff7b72if Te6edf3backbone_support Tff7b72else Ta5d6ff"Ta5d6ffTCPClientInterfaceTa5d6ff"
Te6edf3remote_str Tff7b72= Ta5d6ff"Ta5d6ffremoteTa5d6ff" Tff7b72if Te6edf3backbone_support Tff7b72else Ta5d6ff"Ta5d6fftarget_hostTa5d6ff"
Te6edf3cfg_name Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4]
Te6edf3cfg_remote Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffreachable_onTa5d6ff"Tb4b4b4]
Te6edf3cfg_port Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffportTa5d6ff"Tb4b4b4]
Te6edf3cfg_identity Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6fftransport_idTa5d6ff"Tb4b4b4]
Te6edf3cfg_netname Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffifac_netnameTa5d6ff"Tb4b4b4] Tff7b72if Ta5d6ff"Ta5d6ffifac_netnameTa5d6ff" Tff7b72in Te6edf3info Tff7b72else Tff7b72None
Te6edf3cfg_netkey Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffifac_netkeyTa5d6ff"Tb4b4b4] Tff7b72if Ta5d6ff"Ta5d6ffifac_netkeyTa5d6ff" Tff7b72in Te6edf3info Tff7b72else Tff7b72None
Te6edf3cfg_netname_str Tff7b72= Ta5d6fffTa5d6ff"Tffea00\nTa5d6ff network_name = Tffd700{Te6edf3cfg_netnameTffd700}Ta5d6ff" Tff7b72if Te6edf3cfg_netname Tff7b72else Ta5d6ff"Ta5d6ff"
Te6edf3cfg_netkey_str Tff7b72= Ta5d6fffTa5d6ff"Tffea00\nTa5d6ff passphrase = Tffd700{Te6edf3cfg_netkeyTffd700}Ta5d6ff" Tff7b72if Te6edf3cfg_netkey Tff7b72else Ta5d6ff"Ta5d6ff"
Te6edf3cfg_identity_str Tff7b72= Ta5d6fffTa5d6ff"Tffea00\nTa5d6ff transport_identity = Tffd700{Te6edf3cfg_identityTffd700}Ta5d6ff"
Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffconfig_entryTa5d6ff"Tb4b4b4] Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ff[[Tffd700{Te6edf3cfg_nameTffd700}Ta5d6ff]]Tffea00\nTa5d6ff type = Tffd700{Te6edf3connection_interfaceTffd700}Tffea00\nTa5d6ff enabled = yesTffea00\nTa5d6ff Tffd700{Te6edf3remote_strTffd700}Ta5d6ff = Tffd700{Te6edf3cfg_remoteTffd700}Tffea00\nTa5d6ff target_port = Tffd700{Te6edf3cfg_portTffd700}Tffd700{Te6edf3cfg_identity_strTffd700}Tffd700{Te6edf3cfg_netname_strTffd700}Tffd700{Te6edf3cfg_netkey_strTffd700}Ta5d6ff"

Tff7b72if Te6edf3interface_type Tff7b72== Ta5d6ff"Ta5d6ffI2PInterfaceTa5d6ff"Tb4b4b4:
Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffreachable_onTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3unpackedTb4b4b4[Te6edf3REACHABLE_ONTb4b4b4]
Te6edf3cfg_name Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4]
Te6edf3cfg_remote Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffreachable_onTa5d6ff"Tb4b4b4]
Te6edf3cfg_identity Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6fftransport_idTa5d6ff"Tb4b4b4]
Te6edf3cfg_netname Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffifac_netnameTa5d6ff"Tb4b4b4] Tff7b72if Ta5d6ff"Ta5d6ffifac_netnameTa5d6ff" Tff7b72in Te6edf3info Tff7b72else Tff7b72None
Te6edf3cfg_netkey Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffifac_netkeyTa5d6ff"Tb4b4b4] Tff7b72if Ta5d6ff"Ta5d6ffifac_netkeyTa5d6ff" Tff7b72in Te6edf3info Tff7b72else Tff7b72None
Te6edf3cfg_netname_str Tff7b72= Ta5d6fffTa5d6ff"Tffea00\nTa5d6ff network_name = Tffd700{Te6edf3cfg_netnameTffd700}Ta5d6ff" Tff7b72if Te6edf3cfg_netname Tff7b72else Ta5d6ff"Ta5d6ff"
Te6edf3cfg_netkey_str Tff7b72= Ta5d6fffTa5d6ff"Tffea00\nTa5d6ff passphrase = Tffd700{Te6edf3cfg_netkeyTffd700}Ta5d6ff" Tff7b72if Te6edf3cfg_netkey Tff7b72else Ta5d6ff"Ta5d6ff"
Te6edf3cfg_identity_str Tff7b72= Ta5d6fffTa5d6ff"Tffea00\nTa5d6ff transport_identity = Tffd700{Te6edf3cfg_identityTffd700}Ta5d6ff"
Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffconfig_entryTa5d6ff"Tb4b4b4] Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ff[[Tffd700{Te6edf3cfg_nameTffd700}Ta5d6ff]]Tffea00\nTa5d6ff type = I2PInterfaceTffea00\nTa5d6ff enabled = yesTffea00\nTa5d6ff peers = Tffd700{Te6edf3cfg_remoteTffd700}Tffd700{Te6edf3cfg_identity_strTffd700}Tffd700{Te6edf3cfg_netname_strTffd700}Tffd700{Te6edf3cfg_netkey_strTffd700}Ta5d6ff"

Tff7b72if Te6edf3interface_type Tff7b72== Ta5d6ff"Ta5d6ffRNodeInterfaceTa5d6ff"Tb4b4b4:
Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6fffrequencyTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3unpackedTb4b4b4[Te6edf3FREQUENCYTb4b4b4]
Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffbandwidthTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3unpackedTb4b4b4[Te6edf3BANDWIDTHTb4b4b4]
Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffsfTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3unpackedTb4b4b4[Te6edf3SPREADINGFACTORTb4b4b4]
Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffcrTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3unpackedTb4b4b4[Te6edf3CODINGRATETb4b4b4]
Te6edf3cfg_name Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4]
Te6edf3cfg_frequency Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6fffrequencyTa5d6ff"Tb4b4b4]
Te6edf3cfg_bandwidth Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffbandwidthTa5d6ff"Tb4b4b4]
Te6edf3cfg_sf Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffsfTa5d6ff"Tb4b4b4]
Te6edf3cfg_cr Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffcrTa5d6ff"Tb4b4b4]
Te6edf3cfg_identity Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6fftransport_idTa5d6ff"Tb4b4b4]
Te6edf3cfg_netname Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffifac_netnameTa5d6ff"Tb4b4b4] Tff7b72if Ta5d6ff"Ta5d6ffifac_netnameTa5d6ff" Tff7b72in Te6edf3info Tff7b72else Tff7b72None
Te6edf3cfg_netkey Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffifac_netkeyTa5d6ff"Tb4b4b4] Tff7b72if Ta5d6ff"Ta5d6ffifac_netkeyTa5d6ff" Tff7b72in Te6edf3info Tff7b72else Tff7b72None
Te6edf3cfg_netname_str Tff7b72= Ta5d6fffTa5d6ff"Tffea00\nTa5d6ff network_name = Tffd700{Te6edf3cfg_netnameTffd700}Ta5d6ff" Tff7b72if Te6edf3cfg_netname Tff7b72else Ta5d6ff"Ta5d6ff"
Te6edf3cfg_netkey_str Tff7b72= Ta5d6fffTa5d6ff"Tffea00\nTa5d6ff passphrase = Tffd700{Te6edf3cfg_netkeyTffd700}Ta5d6ff" Tff7b72if Te6edf3cfg_netkey Tff7b72else Ta5d6ff"Ta5d6ff"
Te6edf3cfg_identity_str Tff7b72= Ta5d6fffTa5d6ff"Tffea00\nTa5d6ff transport_identity = Tffd700{Te6edf3cfg_identityTffd700}Ta5d6ff"
Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffconfig_entryTa5d6ff"Tb4b4b4] Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ff[[Tffd700{Te6edf3cfg_nameTffd700}Ta5d6ff]]Tffea00\nTa5d6ff type = RNodeInterfaceTffea00\nTa5d6ff enabled = yesTffea00\nTa5d6ff port = Tffea00\nTa5d6ff frequency = Tffd700{Te6edf3cfg_frequencyTffd700}Tffea00\nTa5d6ff bandwidth = Tffd700{Te6edf3cfg_bandwidthTffd700}Tffea00\nTa5d6ff spreadingfactor = Tffd700{Te6edf3cfg_sfTffd700}Tffea00\nTa5d6ff codingrate = Tffd700{Te6edf3cfg_crTffd700}Tffea00\nTa5d6ff txpower = Tffd700{Te6edf3cfg_netname_strTffd700}Tffd700{Te6edf3cfg_netkey_strTffd700}Ta5d6ff"

Tff7b72if Te6edf3interface_type Tff7b72== Ta5d6ff"Ta5d6ffWeaveInterfaceTa5d6ff"Tb4b4b4:
Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6fffrequencyTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3unpackedTb4b4b4[Te6edf3FREQUENCYTb4b4b4]
Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffbandwidthTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3unpackedTb4b4b4[Te6edf3BANDWIDTHTb4b4b4]
Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffchannelTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3unpackedTb4b4b4[Te6edf3CHANNELTb4b4b4]
Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffmodulationTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3unpackedTb4b4b4[Te6edf3MODULATIONTb4b4b4]
Te6edf3cfg_name Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4]
Te6edf3cfg_identity Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6fftransport_idTa5d6ff"Tb4b4b4]
Te6edf3cfg_netname Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffifac_netnameTa5d6ff"Tb4b4b4] Tff7b72if Ta5d6ff"Ta5d6ffifac_netnameTa5d6ff" Tff7b72in Te6edf3info Tff7b72else Tff7b72None
Te6edf3cfg_netkey Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffifac_netkeyTa5d6ff"Tb4b4b4] Tff7b72if Ta5d6ff"Ta5d6ffifac_netkeyTa5d6ff" Tff7b72in Te6edf3info Tff7b72else Tff7b72None
Te6edf3cfg_netname_str Tff7b72= Ta5d6fffTa5d6ff"Tffea00\nTa5d6ff network_name = Tffd700{Te6edf3cfg_netnameTffd700}Ta5d6ff" Tff7b72if Te6edf3cfg_netname Tff7b72else Ta5d6ff"Ta5d6ff"
Te6edf3cfg_netkey_str Tff7b72= Ta5d6fffTa5d6ff"Tffea00\nTa5d6ff passphrase = Tffd700{Te6edf3cfg_netkeyTffd700}Ta5d6ff" Tff7b72if Te6edf3cfg_netkey Tff7b72else Ta5d6ff"Ta5d6ff"
Te6edf3cfg_identity_str Tff7b72= Ta5d6fffTa5d6ff"Tffea00\nTa5d6ff transport_identity = Tffd700{Te6edf3cfg_identityTffd700}Ta5d6ff"
Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffconfig_entryTa5d6ff"Tb4b4b4] Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ff[[Tffd700{Te6edf3cfg_nameTffd700}Ta5d6ff]]Tffea00\nTa5d6ff type = WeaveInterfaceTffea00\nTa5d6ff enabled = yesTffea00\nTa5d6ff port = Tffd700{Te6edf3cfg_netname_strTffd700}Tffd700{Te6edf3cfg_netkey_strTffd700}Ta5d6ff"

Tff7b72if Te6edf3interface_type Tff7b72== Ta5d6ff"Ta5d6ffKISSInterfaceTa5d6ff"Tb4b4b4:
Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6fffrequencyTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3unpackedTb4b4b4[Te6edf3FREQUENCYTb4b4b4]
Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffbandwidthTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3unpackedTb4b4b4[Te6edf3BANDWIDTHTb4b4b4]
Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffmodulationTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3unpackedTb4b4b4[Te6edf3MODULATIONTb4b4b4]
Te6edf3cfg_name Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4]
Te6edf3cfg_frequency Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6fffrequencyTa5d6ff"Tb4b4b4]
Te6edf3cfg_bandwidth Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffbandwidthTa5d6ff"Tb4b4b4]
Te6edf3cfg_modulation Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffmodulationTa5d6ff"Tb4b4b4]
Te6edf3cfg_identity Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6fftransport_idTa5d6ff"Tb4b4b4]
Te6edf3cfg_netname Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffifac_netnameTa5d6ff"Tb4b4b4] Tff7b72if Ta5d6ff"Ta5d6ffifac_netnameTa5d6ff" Tff7b72in Te6edf3info Tff7b72else Tff7b72None
Te6edf3cfg_netkey Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffifac_netkeyTa5d6ff"Tb4b4b4] Tff7b72if Ta5d6ff"Ta5d6ffifac_netkeyTa5d6ff" Tff7b72in Te6edf3info Tff7b72else Tff7b72None
Te6edf3cfg_netname_str Tff7b72= Ta5d6fffTa5d6ff"Tffea00\nTa5d6ff network_name = Tffd700{Te6edf3cfg_netnameTffd700}Ta5d6ff" Tff7b72if Te6edf3cfg_netname Tff7b72else Ta5d6ff"Ta5d6ff"
Te6edf3cfg_netkey_str Tff7b72= Ta5d6fffTa5d6ff"Tffea00\nTa5d6ff passphrase = Tffd700{Te6edf3cfg_netkeyTffd700}Ta5d6ff" Tff7b72if Te6edf3cfg_netkey Tff7b72else Ta5d6ff"Ta5d6ff"
Te6edf3cfg_identity_str Tff7b72= Ta5d6fffTa5d6ff"Tffea00\nTa5d6ff transport_identity = Tffd700{Te6edf3cfg_identityTffd700}Ta5d6ff"
Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffconfig_entryTa5d6ff"Tb4b4b4] Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ff[[Tffd700{Te6edf3cfg_nameTffd700}Ta5d6ff]]Tffea00\nTa5d6ff type = KISSInterfaceTffea00\nTa5d6ff enabled = yesTffea00\nTa5d6ff port = Tffea00\nTa5d6ff # Frequency: Tffd700{Te6edf3cfg_frequencyTffd700}Tffea00\nTa5d6ff # Bandwidth: Tffd700{Te6edf3cfg_bandwidthTffd700}Tffea00\nTa5d6ff # Modulation: Tffd700{Te6edf3cfg_modulationTffd700}Tffd700{Te6edf3cfg_identity_strTffd700}Tffd700{Te6edf3cfg_netname_strTffd700}Tffd700{Te6edf3cfg_netkey_strTffd700}Ta5d6ff"

Te6edf3discovery_hash_material Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6fftransport_idTa5d6ff"Tb4b4b4]Tff7b72+Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4]
Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffdiscovery_hashTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffull_hashTb4b4b4(Te6edf3discovery_hash_materialTff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4)

Tff7b72if Tff7b72selfTff7b72.Td2a8ffcallback Tff7b72and Tffa657callableTb4b4b4(Tff7b72selfTff7b72.Td2a8ffcallbackTb4b4b4)Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffcallbackTb4b4b4(Te6edf3infoTb4b4b4)

Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffAn error occurred while trying to decode discovered interface. The contained exception was: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)

Tff7b72class T56d364InterfaceDiscoveryTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3THRESHOLD_UNKNOWN Tff7b72= T79c0ff24Tff7b72*T79c0ff60Tff7b72*T79c0ff60
Te6edf3THRESHOLD_STALE Tff7b72= T79c0ff3Tff7b72*T79c0ff24Tff7b72*T79c0ff60Tff7b72*T79c0ff60
Te6edf3THRESHOLD_REMOVE Tff7b72= T79c0ff7Tff7b72*T79c0ff24Tff7b72*T79c0ff60Tff7b72*T79c0ff60

Te6edf3MONITOR_INTERVAL Tff7b72= T79c0ff5
Te6edf3DETACH_THRESHOLD Tff7b72= T79c0ff12

Te6edf3STATUS_STALE Tff7b72= T79c0ff0
Te6edf3STATUS_UNKNOWN Tff7b72= T79c0ff100
Te6edf3STATUS_AVAILABLE Tff7b72= T79c0ff1000
Te6edf3STATUS_CODE_MAP Tff7b72= Tb4b4b4{Ta5d6ff"Ta5d6ffavailableTa5d6ff"Tb4b4b4: Te6edf3STATUS_AVAILABLETb4b4b4, Ta5d6ff"Ta5d6ffunknownTa5d6ff"Tb4b4b4: Te6edf3STATUS_UNKNOWNTb4b4b4, Ta5d6ff"Ta5d6ffstaleTa5d6ff"Tb4b4b4: Te6edf3STATUS_STALETb4b4b4}
Te6edf3AUTOCONNECT_TYPES Tff7b72= Tb4b4b4[Ta5d6ff"Ta5d6ffBackboneInterfaceTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffTCPServerInterfaceTa5d6ff"Tb4b4b4]
Te6edf3DISCOVERABLE_TYPES Tff7b72= Tb4b4b4[Ta5d6ff"Ta5d6ffBackboneInterfaceTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffTCPServerInterfaceTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffI2PInterfaceTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffRNodeInterfaceTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffWeaveInterfaceTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffKISSInterfaceTa5d6ff"Tb4b4b4]

Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3required_valueTff7b72=Te6edf3InterfaceAnnouncerTff7b72.Td2a8ffDEFAULT_STAMP_VALUETb4b4b4, Te6edf3callbackTff7b72=Tff7b72NoneTb4b4b4, Te6edf3discover_interfacesTff7b72=Tff7b72TrueTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Te6edf3required_valueTb4b4b4: Te6edf3required_value Tff7b72= Te6edf3InterfaceAnnouncerTff7b72.Td2a8ffDEFAULT_STAMP_VALUE

Tff7b72selfTff7b72.Td2a8ffrequired_value Tff7b72= Te6edf3required_value
Tff7b72selfTff7b72.Td2a8ffdiscovery_callback Tff7b72= Te6edf3callback
Tff7b72selfTff7b72.Td2a8ffrns_instance Tff7b72= Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffget_instanceTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffmonitored_interfaces Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72selfTff7b72.Td2a8ffmonitoring_autoconnects Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffmonitor_interval Tff7b72= Tff7b72selfTff7b72.Td2a8ffMONITOR_INTERVAL
Tff7b72selfTff7b72.Td2a8ffdetach_threshold Tff7b72= Tff7b72selfTff7b72.Td2a8ffDETACH_THRESHOLD
Tff7b72selfTff7b72.Td2a8ffinitial_autoconnect_ran Tff7b72= Tff7b72False

Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffrns_instanceTb4b4b4: Tff7b72raise Tf85149SystemErrorTb4b4b4(Ta5d6ff"Ta5d6ffAttempt to start interface discovery listener without an active RNS instanceTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffstoragepath Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffstoragepathTb4b4b4, Ta5d6ff"Ta5d6ffdiscoveryTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffinterfacesTa5d6ff"Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Tff7b72selfTff7b72.Td2a8ffstoragepathTb4b4b4)Tb4b4b4: Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Tff7b72selfTff7b72.Td2a8ffstoragepathTb4b4b4)
Tff7b72if Te6edf3discover_interfacesTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffhandler Tff7b72= Te6edf3InterfaceAnnounceHandlerTb4b4b4(Te6edf3callbackTff7b72=Tff7b72selfTff7b72.Td2a8ffinterface_discoveredTb4b4b4, Te6edf3required_valueTff7b72=Tff7b72selfTff7b72.Td2a8ffrequired_valueTb4b4b4)
Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffregister_announce_handlerTb4b4b4(Tff7b72selfTff7b72.Td2a8ffhandlerTb4b4b4)
Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Tff7b72selfTff7b72.Td2a8ffconnect_discoveredTb4b4b4, Te6edf3daemonTff7b72=Tff7b72TrueTb4b4b4)Tff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8fflist_discovered_interfacesTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3only_availableTff7b72=Tff7b72FalseTb4b4b4, Te6edf3only_transportTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4:
Te6edf3now Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Te6edf3discovered_interfaces Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3discovery_sources Tff7b72= Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffinterface_discovery_sourcesTb4b4b4(Tb4b4b4)
Tff7b72for Te6edf3filename Tff7b72in Te6edf3osTff7b72.Td2a8fflistdirTb4b4b4(Tff7b72selfTff7b72.Td2a8ffstoragepathTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3filepath Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Tff7b72selfTff7b72.Td2a8ffstoragepathTb4b4b4, Te6edf3filenameTb4b4b4)
Tff7b72with Tffa657openTb4b4b4(Te6edf3filepathTb4b4b4, Ta5d6ff"Ta5d6ffrbTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3fTb4b4b4: Te6edf3info Tff7b72= Te6edf3msgpackTff7b72.Td2a8ffunpackbTb4b4b4(Te6edf3fTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3should_remove Tff7b72= Tff7b72False
Te6edf3heard_delta Tff7b72= Te6edf3nowTff7b72-Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6fflast_heardTa5d6ff"Tb4b4b4]
Tff7b72if Te6edf3heard_delta Tff7b72> Tff7b72selfTff7b72.Td2a8ffTHRESHOLD_REMOVETb4b4b4: Te6edf3should_remove Tff7b72= Tff7b72True
Tff7b72elif Te6edf3discovery_sources Tff7b72and Tff7b72not Ta5d6ff"Ta5d6ffnetwork_idTa5d6ff" Tff7b72in Te6edf3infoTb4b4b4: Te6edf3should_remove Tff7b72= Tff7b72True
Tff7b72elif Te6edf3discovery_sources Tff7b72and Tff7b72not Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffnetwork_idTa5d6ff"Tb4b4b4]Tb4b4b4) Tff7b72in Te6edf3discovery_sourcesTb4b4b4: Te6edf3should_remove Tff7b72= Tff7b72True
Tff7b72elif Tff7b72not Ta5d6ff"Ta5d6fftypeTa5d6ff" Tff7b72in Te6edf3info Tff7b72or Tb4b4b4(Ta5d6ff"Ta5d6fftypeTa5d6ff" Tff7b72in Te6edf3info Tff7b72and Tff7b72not Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4] Tff7b72in Tff7b72selfTff7b72.Td2a8ffDISCOVERABLE_TYPESTb4b4b4)Tb4b4b4: Te6edf3should_remove Tff7b72= Tff7b72True
Tff7b72elif Ta5d6ff"Ta5d6ffreachable_onTa5d6ff" Tff7b72in Te6edf3infoTb4b4b4:
Tff7b72if Tff7b72not Tb4b4b4(Te6edf3is_ip_addressTb4b4b4(Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffreachable_onTa5d6ff"Tb4b4b4]Tb4b4b4) Tff7b72or Te6edf3is_hostnameTb4b4b4(Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffreachable_onTa5d6ff"Tb4b4b4]Tb4b4b4)Tb4b4b4)Tb4b4b4: Te6edf3should_remove Tff7b72= Tff7b72True

Tff7b72if Te6edf3should_removeTb4b4b4:
Te6edf3osTff7b72.Td2a8ffunlinkTb4b4b4(Te6edf3filepathTb4b4b4)
Tff7b72continue
Tff7b72elseTb4b4b4:
Tff7b72if Te6edf3heard_delta Tff7b72> Tff7b72selfTff7b72.Td2a8ffTHRESHOLD_STALETb4b4b4: Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffstatusTa5d6ff"Tb4b4b4] Tff7b72= Ta5d6ff"Ta5d6ffstaleTa5d6ff"
Tff7b72elif Te6edf3heard_delta Tff7b72> Tff7b72selfTff7b72.Td2a8ffTHRESHOLD_UNKNOWNTb4b4b4: Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffstatusTa5d6ff"Tb4b4b4] Tff7b72= Ta5d6ff"Ta5d6ffunknownTa5d6ff"
Tff7b72elseTb4b4b4: Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffstatusTa5d6ff"Tb4b4b4] Tff7b72= Ta5d6ff"Ta5d6ffavailableTa5d6ff"

Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffstatus_codeTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72selfTff7b72.Td2a8ffSTATUS_CODE_MAPTb4b4b4[Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffstatusTa5d6ff"Tb4b4b4]Tb4b4b4]
Tff7b72if Tff7b72not Te6edf3only_available Tff7b72and Tff7b72not Te6edf3only_transportTb4b4b4: Te6edf3discovered_interfacesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3infoTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3should_append Tff7b72= Tff7b72True
Te6edf3status Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffstatusTa5d6ff"Tb4b4b4]
Te6edf3transport Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6fftransportTa5d6ff"Tb4b4b4]
Tff7b72if Te6edf3only_available Tff7b72and Te6edf3status Tff7b72!= Ta5d6ff"Ta5d6ffavailableTa5d6ff"Tb4b4b4: Te6edf3should_append Tff7b72= Tff7b72False
Tff7b72if Te6edf3only_transport Tff7b72and Tff7b72not Te6edf3transportTb4b4b4: Te6edf3should_append Tff7b72= Tff7b72False
Tff7b72if Te6edf3should_appendTb4b4b4: Te6edf3discovered_interfacesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3infoTb4b4b4)

Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffError while loading discovered interface data: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffThe interface data file Tffd700{Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Tff7b72selfTff7b72.Td2a8ffstoragepathTb4b4b4, Te6edf3filenameTb4b4b4)Tffd700}Ta5d6ff may be corruptTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fftrace_exceptionTb4b4b4(Te6edf3eTb4b4b4)

Te6edf3discovered_interfacesTff7b72.Td2a8ffsortTb4b4b4(Te6edf3keyTff7b72=Tff7b72lambda Te6edf3infoTb4b4b4: Tb4b4b4(Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffstatus_codeTa5d6ff"Tb4b4b4]Tb4b4b4, Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffvalueTa5d6ff"Tb4b4b4]Tb4b4b4, Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6fflast_heardTa5d6ff"Tb4b4b4]Tb4b4b4)Tb4b4b4, Te6edf3reverseTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72return Te6edf3discovered_interfaces

Tff7b72def Td2a8ffinterface_discoveredTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3infoTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3name Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4]
Te6edf3value Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffvalueTa5d6ff"Tb4b4b4]
Te6edf3interface_type Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4]
Te6edf3discovery_hash Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffdiscovery_hashTa5d6ff"Tb4b4b4]
Te6edf3discovered_type Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4]
Tff7b72if Tff7b72not Te6edf3discovered_type Tff7b72in Tff7b72selfTff7b72.Td2a8ffDISCOVERABLE_TYPESTb4b4b4: Tff7b72return
Te6edf3hops Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffhopsTa5d6ff"Tb4b4b4]Tb4b4b4; Te6edf3ms Tff7b72= Ta5d6ff"Ta5d6ff" Tff7b72if Te6edf3hops Tff7b72== T79c0ff1 Tff7b72else Ta5d6ff"Ta5d6ffsTa5d6ff"
Te6edf3filename Tff7b72= Te6edf3RNSTff7b72.Td2a8ffhexrepTb4b4b4(Te6edf3discovery_hashTb4b4b4, Te6edf3delimitTff7b72=Tff7b72FalseTb4b4b4)
Te6edf3filepath Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Tff7b72selfTff7b72.Td2a8ffstoragepathTb4b4b4, Te6edf3filenameTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffDiscovered Tffd700{Te6edf3interface_typeTffd700}Ta5d6ff Tffd700{Te6edf3hopsTffd700}Ta5d6ff hopTffd700{Te6edf3msTffd700}Ta5d6ff away with stamp value Tffd700{Te6edf3valueTffd700}Ta5d6ff: Tffd700{Te6edf3nameTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3filepathTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72with Tffa657openTb4b4b4(Te6edf3filepathTb4b4b4, Ta5d6ff"Ta5d6ffwbTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3fTb4b4b4:
Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffdiscoveredTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffreceivedTa5d6ff"Tb4b4b4]
Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6fflast_heardTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffreceivedTa5d6ff"Tb4b4b4]
Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffheard_countTa5d6ff"Tb4b4b4] Tff7b72= T79c0ff0
Te6edf3fTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3msgpackTff7b72.Td2a8ffpackbTb4b4b4(Te6edf3infoTb4b4b4)Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffError while persisting discovered interface data: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fftrace_exceptionTb4b4b4(Te6edf3eTb4b4b4)
Tff7b72return

Tff7b72elseTb4b4b4:
Te6edf3discovered Tff7b72= Tff7b72None
Te6edf3heard_count Tff7b72= Tff7b72None
Tff7b72tryTb4b4b4:
Tff7b72with Tffa657openTb4b4b4(Te6edf3filepathTb4b4b4, Ta5d6ff"Ta5d6ffrbTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3fTb4b4b4:
Te6edf3last_info Tff7b72= Te6edf3msgpackTff7b72.Td2a8ffunpackbTb4b4b4(Te6edf3fTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3discovered Tff7b72= Te6edf3last_infoTb4b4b4[Ta5d6ff"Ta5d6ffdiscoveredTa5d6ff"Tb4b4b4]
Te6edf3heard_count Tff7b72= Te6edf3last_infoTb4b4b4[Ta5d6ff"Ta5d6ffheard_countTa5d6ff"Tb4b4b4]

Tff7b72if Te6edf3discovered Tff7b72== Tff7b72NoneTb4b4b4: Te6edf3discovered Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffdiscoveredTa5d6ff"Tb4b4b4]
Tff7b72if Te6edf3heard_count Tff7b72== Tff7b72NoneTb4b4b4: Te6edf3heard_count Tff7b72= T79c0ff0

Tff7b72with Tffa657openTb4b4b4(Te6edf3filepathTb4b4b4, Ta5d6ff"Ta5d6ffwbTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3fTb4b4b4:
Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffdiscoveredTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3discovered
Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6fflast_heardTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffreceivedTa5d6ff"Tb4b4b4]
Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffheard_countTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3heard_countTff7b72+T79c0ff1
Te6edf3fTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3msgpackTff7b72.Td2a8ffpackbTb4b4b4(Te6edf3infoTb4b4b4)Tb4b4b4)

Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffError while persisting discovered interface data: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fftrace_exceptionTb4b4b4(Te6edf3eTb4b4b4)
Tff7b72return

Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffError processing discovered interface data: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fftrace_exceptionTb4b4b4(Te6edf3eTb4b4b4)
Tff7b72return

Tff7b72selfTff7b72.Td2a8ffautoconnectTb4b4b4(Te6edf3infoTb4b4b4)

Tff7b72tryTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffdiscovery_callback Tff7b72and Tffa657callableTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdiscovery_callbackTb4b4b4)Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffdiscovery_callbackTb4b4b4(Te6edf3infoTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffError while processing external interface discovery callback: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)

Tff7b72def Td2a8ffmonitor_interfaceTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3interfaceTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Te6edf3interface Tff7b72in Tff7b72selfTff7b72.Td2a8ffmonitored_interfacesTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffmonitored_interfacesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3interfaceTb4b4b4)

Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffmonitoring_autoconnectsTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffmonitoring_autoconnects Tff7b72= Tff7b72True
Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Tff7b72selfTff7b72.Td2a8ff__monitor_jobTb4b4b4, Te6edf3daemonTff7b72=Tff7b72TrueTb4b4b4)Tff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ff__monitor_jobTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72while Tff7b72selfTff7b72.Td2a8ffmonitoring_autoconnectsTb4b4b4:
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(Tff7b72selfTff7b72.Td2a8ffmonitor_intervalTb4b4b4)
Te6edf3detached_interfaces Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3online_interfaces Tff7b72= T79c0ff0
Te6edf3autoconnected_interfaces Tff7b72= Tff7b72selfTff7b72.Td2a8ffautoconnect_countTb4b4b4(Tb4b4b4)
Tff7b72for Te6edf3interface Tff7b72in Tff7b72selfTff7b72.Td2a8ffmonitored_interfacesTb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72if Te6edf3interfaceTff7b72.Td2a8ffonlineTb4b4b4:
Te6edf3online_interfaces Tff7b72+Tff7b72= T79c0ff1
Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3interfaceTb4b4b4, Ta5d6ff"Ta5d6ffautoconnect_downTa5d6ff"Tb4b4b4) Tff7b72and Te6edf3interfaceTff7b72.Td2a8ffautoconnect_down Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffAuto-discovered interface Tffd700{Te6edf3interfaceTffd700}Ta5d6ff reconnectedTa5d6ff"Tb4b4b4)
Te6edf3interfaceTff7b72.Td2a8ffautoconnect_down Tff7b72= Tff7b72None

Tff7b72elseTb4b4b4:
Tff7b72if Tff7b72not Tffa657hasattrTb4b4b4(Te6edf3interfaceTb4b4b4, Ta5d6ff"Ta5d6ffautoconnect_downTa5d6ff"Tb4b4b4) Tff7b72or Te6edf3interfaceTff7b72.Td2a8ffautoconnect_down Tff7b72== Tff7b72NoneTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffAuto-discovered interface Tffd700{Te6edf3interfaceTffd700}Ta5d6ff disconnectedTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Te6edf3interfaceTff7b72.Td2a8ffautoconnect_down Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)

Tff7b72elseTb4b4b4:
Te6edf3down_for Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tff7b72-Te6edf3interfaceTff7b72.Td2a8ffautoconnect_down
Tff7b72if Te6edf3down_for Tff7b72>Tff7b72= Tff7b72selfTff7b72.Td2a8ffdetach_thresholdTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffAuto-discovered interface Tffd700{Te6edf3interfaceTffd700}Ta5d6ff has been down for Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettytimeTb4b4b4(Te6edf3down_forTb4b4b4)Tffd700}Ta5d6ff, detachingTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Te6edf3detached_interfacesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3interfaceTb4b4b4)

Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffError while checking auto-connected interface state for Tffd700{Te6edf3interfaceTffd700}Ta5d6ff: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)

Te6edf3max_autoconnected_interfaces Tff7b72= Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffmax_autoconnected_interfacesTb4b4b4(Tb4b4b4)
Te6edf3free_slots Tff7b72= Tffa657maxTb4b4b4(T79c0ff0Tb4b4b4, Te6edf3max_autoconnected_interfaces Tff7b72- Te6edf3autoconnected_interfacesTb4b4b4)
Te6edf3reserved_slots Tff7b72= Te6edf3max_autoconnected_interfacesTff7b72/Tff7b72/T79c0ff4

Tff7b72if Te6edf3online_interfaces Tff7b72>Tff7b72= Te6edf3max_autoconnected_interfacesTb4b4b4:
Tff7b72for Te6edf3interface Tff7b72in Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffinterfacesTb4b4b4:
Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3interfaceTb4b4b4, Ta5d6ff"Ta5d6ffbootstrap_onlyTa5d6ff"Tb4b4b4) Tff7b72and Te6edf3interfaceTff7b72.Td2a8ffbootstrap_only Tff7b72== Tff7b72TrueTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffTearing down bootstrap-only Tffd700{Te6edf3interfaceTffd700}Ta5d6ff since target connected auto-discovered interface count has been reachedTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_INFOTb4b4b4)
Tff7b72if Tff7b72not Te6edf3interface Tff7b72in Te6edf3detached_interfacesTb4b4b4: Te6edf3detached_interfacesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3interfaceTb4b4b4)

Tff7b72if Te6edf3online_interfaces Tff7b72== T79c0ff0Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffbootstrap_interface_countTb4b4b4(Tb4b4b4) Tff7b72== T79c0ff0Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffNo auto-discovered interfaces connected, re-enabling bootstrap interfacesTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_NOTICETb4b4b4)
Tff7b72for Te6edf3config Tff7b72in Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffget_instanceTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffbootstrap_configsTb4b4b4:
Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffget_instanceTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ff_synthesize_interfaceTb4b4b4(Te6edf3configTb4b4b4, Te6edf3configTb4b4b4[Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4]Tb4b4b4)

Tff7b72if Tff7b72selfTff7b72.Td2a8ffinitial_autoconnect_ran Tff7b72and Te6edf3free_slots Tff7b72> Te6edf3reserved_slotsTb4b4b4:
Te6edf3candidate_interfaces Tff7b72= Tff7b72selfTff7b72.Td2a8fflist_discovered_interfacesTb4b4b4(Te6edf3only_availableTff7b72=Tff7b72TrueTb4b4b4, Te6edf3only_transportTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72if Tffa657lenTb4b4b4(Te6edf3candidate_interfacesTb4b4b4) Tff7b72> T79c0ff0Tb4b4b4:
Te6edf3randomTff7b72.Td2a8ffshuffleTb4b4b4(Te6edf3candidate_interfacesTb4b4b4)
Te6edf3selected_interface Tff7b72= Te6edf3candidate_interfacesTb4b4b4[T79c0ff0Tb4b4b4]
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffinterface_existsTb4b4b4(Te6edf3selected_interfaceTb4b4b4)Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffautoconnectTb4b4b4(Te6edf3selected_interfaceTb4b4b4)

Tff7b72for Te6edf3interface Tff7b72in Te6edf3detached_interfacesTb4b4b4:
Tff7b72tryTb4b4b4: Tff7b72selfTff7b72.Td2a8ffteardown_interfaceTb4b4b4(Te6edf3interfaceTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffError while de-registering auto-connected interface from transport: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)

Tff7b72def Td2a8ffteardown_interfaceTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3interfaceTb4b4b4)Tb4b4b4:
Te6edf3interfaceTff7b72.Td2a8ffdetachTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3interface Tff7b72in Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffinterfacesTb4b4b4: Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffinterfacesTff7b72.Td2a8ffremoveTb4b4b4(Te6edf3interfaceTb4b4b4)
Tff7b72if Te6edf3interface Tff7b72in Tff7b72selfTff7b72.Td2a8ffmonitored_interfacesTb4b4b4: Tff7b72selfTff7b72.Td2a8ffmonitored_interfacesTff7b72.Td2a8ffremoveTb4b4b4(Te6edf3interfaceTb4b4b4)

Tff7b72def Td2a8ffautoconnect_countTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tffa657lenTb4b4b4(Tb4b4b4[Te6edf3i Tff7b72for Te6edf3i Tff7b72in Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffinterfaces Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3iTb4b4b4, Ta5d6ff"Ta5d6ffautoconnect_hashTa5d6ff"Tb4b4b4)Tb4b4b4]Tb4b4b4)

Tff7b72def Td2a8ffbootstrap_interface_countTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tffa657lenTb4b4b4(Tb4b4b4[Te6edf3i Tff7b72for Te6edf3i Tff7b72in Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffinterfaces Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3iTb4b4b4, Ta5d6ff"Ta5d6ffbootstrap_onlyTa5d6ff"Tb4b4b4) Tff7b72and Te6edf3iTff7b72.Td2a8ffbootstrap_only Tff7b72== Tff7b72TrueTb4b4b4]Tb4b4b4)
Tff7b72def Td2a8ffconnect_discoveredTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffshould_autoconnect_discovered_interfacesTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3discovered_interfaces Tff7b72= Tff7b72selfTff7b72.Td2a8fflist_discovered_interfacesTb4b4b4(Te6edf3only_transportTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72for Te6edf3info Tff7b72in Te6edf3discovered_interfacesTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffautoconnect_countTb4b4b4(Tb4b4b4) Tff7b72>Tff7b72= Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffmax_autoconnected_interfacesTb4b4b4(Tb4b4b4)Tb4b4b4: Tff7b72break
Tff7b72selfTff7b72.Td2a8ffautoconnectTb4b4b4(Te6edf3infoTb4b4b4)

Tff7b72selfTff7b72.Td2a8ffinitial_autoconnect_ran Tff7b72= Tff7b72True

Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffError while reconnecting discovered interfaces: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)

Tff7b72def Td2a8ffendpoint_hashTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3infoTb4b4b4)Tb4b4b4:
Te6edf3endpoint_specifier Tff7b72= Ta5d6ff"Ta5d6ff"
Tff7b72if Ta5d6ff"Ta5d6ffreachable_onTa5d6ff" Tff7b72in Te6edf3infoTb4b4b4: Te6edf3endpoint_specifier Tff7b72+Tff7b72= Tffa657strTb4b4b4(Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffreachable_onTa5d6ff"Tb4b4b4]Tb4b4b4)
Tff7b72if Ta5d6ff"Ta5d6ffportTa5d6ff" Tff7b72in Te6edf3infoTb4b4b4: Te6edf3endpoint_specifier Tff7b72+Tff7b72= Ta5d6ff"Ta5d6ff:Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffportTa5d6ff"Tb4b4b4]Tb4b4b4)
Te6edf3endpoint_hash Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffull_hashTb4b4b4(Te6edf3endpoint_specifierTff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72return Te6edf3endpoint_hash

Tff7b72def Td2a8ffinterface_existsTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3infoTb4b4b4)Tb4b4b4:
Te6edf3exists Tff7b72= Tff7b72False
Tff7b72for Te6edf3interface Tff7b72in Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffinterfacesTb4b4b4:
Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3interfaceTb4b4b4, Ta5d6ff"Ta5d6ffautoconnect_hashTa5d6ff"Tb4b4b4) Tff7b72and Te6edf3interfaceTff7b72.Td2a8ffautoconnect_hash Tff7b72== Tff7b72selfTff7b72.Td2a8ffendpoint_hashTb4b4b4(Te6edf3infoTb4b4b4)Tb4b4b4:
Te6edf3exists Tff7b72= Tff7b72True
Tff7b72break
Tff7b72elseTb4b4b4:
Te6edf3dest_match Tff7b72= Ta5d6ff"Ta5d6ffreachable_onTa5d6ff" Tff7b72in Te6edf3info Tff7b72and Tffa657hasattrTb4b4b4(Te6edf3interfaceTb4b4b4, Ta5d6ff"Ta5d6fftarget_ipTa5d6ff"Tb4b4b4) Tff7b72and Te6edf3interfaceTff7b72.Td2a8fftarget_ip Tff7b72== Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffreachable_onTa5d6ff"Tb4b4b4]
Te6edf3port_match Tff7b72= Tff7b72not Ta5d6ff"Ta5d6ffportTa5d6ff" Tff7b72in Te6edf3info Tff7b72or Tb4b4b4(Tffa657hasattrTb4b4b4(Te6edf3interfaceTb4b4b4, Ta5d6ff"Ta5d6fftarget_portTa5d6ff"Tb4b4b4) Tff7b72and Ta5d6ff"Ta5d6ffportTa5d6ff" Tff7b72in Te6edf3info Tff7b72and Te6edf3interfaceTff7b72.Td2a8fftarget_port Tff7b72== Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffportTa5d6ff"Tb4b4b4]Tb4b4b4)
Te6edf3b32d_match Tff7b72= Ta5d6ff"Ta5d6ffreachable_onTa5d6ff" Tff7b72in Te6edf3info Tff7b72and Tffa657hasattrTb4b4b4(Te6edf3interfaceTb4b4b4, Ta5d6ff"Ta5d6ffb32Ta5d6ff"Tb4b4b4) Tff7b72and Te6edf3interfaceTff7b72.Td2a8ffb32 Tff7b72== Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffreachable_onTa5d6ff"Tb4b4b4]

Tff7b72if Tb4b4b4(Te6edf3dest_match Tff7b72and Te6edf3port_matchTb4b4b4) Tff7b72or Te6edf3b32d_matchTb4b4b4:
Te6edf3exists Tff7b72= Tff7b72True
Tff7b72break

Tff7b72return Te6edf3exists

Tff7b72def Td2a8ffautoconnectTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3infoTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72if Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffshould_autoconnect_discovered_interfacesTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3autoconnected_count Tff7b72= Tff7b72selfTff7b72.Td2a8ffautoconnect_countTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3autoconnected_count Tff7b72< Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffmax_autoconnected_interfacesTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3interface_type Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4]
Tff7b72if Te6edf3interface_type Tff7b72in Tff7b72selfTff7b72.Td2a8ffAUTOCONNECT_TYPESTb4b4b4:
Te6edf3endpoint_hash Tff7b72= Tff7b72selfTff7b72.Td2a8ffendpoint_hashTb4b4b4(Te6edf3infoTb4b4b4)
Te6edf3exists Tff7b72= Tff7b72selfTff7b72.Td2a8ffinterface_existsTb4b4b4(Te6edf3infoTb4b4b4)

Tff7b72if Te6edf3existsTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffDiscovered Tffd700{Te6edf3interface_typeTffd700}Ta5d6ff already exists, not auto-connectingTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72if Te6edf3interface_type Tff7b72== Ta5d6ff"Ta5d6ffTCPClientInterfaceTa5d6ff"Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffYour operating system does not support the Backbone interface type, and must degrade to using TCPClientInterface insteadTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffAuto-connecting discovered TCPClient interfaces is not yet implemented, aborting auto-connectTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffYou can obtain the configuration entry and add this interface manually instead using rnstatus -DTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4)
Tff7b72return

Tff7b72if Te6edf3interface_type Tff7b72== Ta5d6ff"Ta5d6ffI2PInterfaceTa5d6ff"Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffAuto-connecting discovered I2P interfaces is not yet implemented, aborting auto-connectTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffYou can obtain the configuration entry and add this interface manually instead using rnstatus -DTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4)
Tff7b72return

Te6edf3interface_name Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4]
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffAuto-connecting discovered Tffd700{Te6edf3interface_typeTffd700}Ta5d6ff Tffd700{Te6edf3interface_nameTffd700}Ta5d6ff"Tb4b4b4)
Te6edf3config_entry Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffconfig_entryTa5d6ff"Tb4b4b4]
Te6edf3interface_config Tff7b72= Tb4b4b4{Tb4b4b4}
Te6edf3interface_configTb4b4b4[Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4] Tff7b72= Ta5d6fffTa5d6ff"Tffd700{Te6edf3interface_nameTffd700}Ta5d6ff"
Te6edf3ifac_netname Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffifac_netnameTa5d6ff"Tb4b4b4] Tff7b72if Ta5d6ff"Ta5d6ffifac_netnameTa5d6ff" Tff7b72in Te6edf3info Tff7b72else Tff7b72None
Te6edf3ifac_netkey Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffifac_netkeyTa5d6ff"Tb4b4b4] Tff7b72if Ta5d6ff"Ta5d6ffifac_netkeyTa5d6ff" Tff7b72in Te6edf3info Tff7b72else Tff7b72None
Te6edf3interface Tff7b72= Tff7b72None

Tff7b72if Te6edf3interface_type Tff7b72== Ta5d6ff"Ta5d6ffBackboneInterfaceTa5d6ff"Tb4b4b4:
Tff7b72from T7ee787RNST7ee787.T7ee787Interfaces Tff7b72import Te6edf3BackboneInterface
Te6edf3interface_configTb4b4b4[Ta5d6ff"Ta5d6fftarget_hostTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffreachable_onTa5d6ff"Tb4b4b4]
Te6edf3interface_configTb4b4b4[Ta5d6ff"Ta5d6fftarget_portTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffportTa5d6ff"Tb4b4b4]
Te6edf3interface Tff7b72= Te6edf3BackboneInterfaceTff7b72.Td2a8ffBackboneClientInterfaceTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffTransportTb4b4b4, Te6edf3interface_configTb4b4b4)

Tff7b72if Te6edf3interfaceTb4b4b4:
Te6edf3interfaceTff7b72.Td2a8ffautoconnect_hash Tff7b72= Te6edf3endpoint_hash
Te6edf3interfaceTff7b72.Td2a8ffautoconnect_source Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffnetwork_idTa5d6ff"Tb4b4b4]
Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffget_instanceTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ff_add_interfaceTb4b4b4(Te6edf3interfaceTb4b4b4, Te6edf3ifac_netnameTff7b72=Te6edf3ifac_netnameTb4b4b4, Te6edf3ifac_netkeyTff7b72=Te6edf3ifac_netkeyTb4b4b4, Te6edf3configured_bitrateTff7b72=T79c0ff5E6Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffmonitor_interfaceTb4b4b4(Te6edf3interfaceTb4b4b4)

Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffError while auto-connecting discovered interface: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fftrace_exceptionTb4b4b4(Te6edf3eTb4b4b4)

Tff7b72class T56d364BlackholeUpdaterTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3INITIAL_WAIT Tff7b72= T79c0ff20
Te6edf3JOB_INTERVAL Tff7b72= T79c0ff60
Te6edf3UPDATE_INTERVAL Tff7b72= T79c0ff1Tff7b72*T79c0ff60Tff7b72*T79c0ff60
Te6edf3SOURCE_TIMEOUT Tff7b72= T79c0ff25

Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8fflast_updates Tff7b72= Tb4b4b4{Tb4b4b4}
Tff7b72selfTff7b72.Td2a8ffshould_run Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffjob_interval Tff7b72= Tff7b72selfTff7b72.Td2a8ffJOB_INTERVAL
Tff7b72selfTff7b72.Td2a8ffupdate_lock Tff7b72= Te6edf3threadingTff7b72.Td2a8ffLockTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ffstartTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffshould_runTb4b4b4:
Te6edf3source_count Tff7b72= Tffa657lenTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffblackhole_sourcesTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3ms Tff7b72= Ta5d6ff"Ta5d6ff" Tff7b72if Te6edf3source_count Tff7b72== T79c0ff1 Tff7b72else Ta5d6ff"Ta5d6ffsTa5d6ff"
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffStarting blackhole updater with Tffd700{Te6edf3source_countTffd700}Ta5d6ff sourceTffd700{Te6edf3msTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffshould_run Tff7b72= Tff7b72True
Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Tff7b72selfTff7b72.Td2a8ffjobTb4b4b4, Te6edf3daemonTff7b72=Tff7b72TrueTb4b4b4)Tff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ffstopTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffshould_run Tff7b72= Tff7b72False

Tff7b72def Td2a8ffupdate_link_establishedTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3linkTb4b4b4)Tb4b4b4:
Te6edf3remote_identity Tff7b72= Te6edf3linkTff7b72.Td2a8ffget_remote_identityTb4b4b4(Tb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffLink established for blackhole list update from Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3remote_identityTff7b72.Td2a8ffhashTb4b4b4)Tffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Te6edf3receipt Tff7b72= Te6edf3linkTff7b72.Td2a8ffrequestTb4b4b4(Ta5d6ff"Ta5d6ff/listTa5d6ff"Tb4b4b4)
Tff7b72while Tff7b72not Te6edf3receiptTff7b72.Td2a8ffconcludedTb4b4b4(Tb4b4b4)Tb4b4b4: Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.2Tb4b4b4)
Te6edf3response Tff7b72= Te6edf3receiptTff7b72.Td2a8ffget_responseTb4b4b4(Tb4b4b4)
Te6edf3linkTff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)
Tff7b72if Tffa657typeTb4b4b4(Te6edf3responseTb4b4b4) Tff7b72== Tffa657dictTb4b4b4: Te6edf3blackhole_list Tff7b72= Te6edf3response
Tff7b72elseTb4b4b4: Te6edf3blackhole_list Tff7b72= Tff7b72None

Tff7b72if Te6edf3blackhole_listTb4b4b4:
Te6edf3added Tff7b72= T79c0ff0
Tff7b72for Te6edf3identity_hash Tff7b72in Te6edf3blackhole_listTb4b4b4:
Te6edf3entry Tff7b72= Te6edf3blackhole_listTb4b4b4[Te6edf3identity_hashTb4b4b4]
Tff7b72if Tff7b72not Te6edf3identity_hash Tff7b72in Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffblackholed_identitiesTb4b4b4:
Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffblackholed_identitiesTb4b4b4[Te6edf3identity_hashTb4b4b4] Tff7b72= Te6edf3entry
Te6edf3added Tff7b72+Tff7b72= T79c0ff1

Tff7b72if Te6edf3added Tff7b72> T79c0ff0Tb4b4b4:
Te6edf3spec Tff7b72= Ta5d6ff"Ta5d6ffidentityTa5d6ff" Tff7b72if Te6edf3added Tff7b72== T79c0ff1 Tff7b72else Ta5d6ff"Ta5d6ffidentitiesTa5d6ff"
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffAdded Tffd700{Te6edf3addedTffd700}Ta5d6ff blackholed Tffd700{Te6edf3specTffd700}Ta5d6ff from Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3remote_identityTff7b72.Td2a8ffhashTb4b4b4)Tffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)

Tff7b72tryTb4b4b4:
Te6edf3sourcelistpath Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffblackholepathTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffhexrepTb4b4b4(Te6edf3remote_identityTff7b72.Td2a8ffhashTb4b4b4, Te6edf3delimitTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4)
Te6edf3tmppath Tff7b72= Ta5d6fffTa5d6ff"Tffd700{Te6edf3sourcelistpathTffd700}Ta5d6ff.tmpTa5d6ff"
Tff7b72with Tffa657openTb4b4b4(Te6edf3tmppathTb4b4b4, Ta5d6ff"Ta5d6ffwbTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3fTb4b4b4: Te6edf3fTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3msgpackTff7b72.Td2a8ffpackbTb4b4b4(Te6edf3blackhole_listTb4b4b4)Tb4b4b4)
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3sourcelistpathTb4b4b4)Tb4b4b4: Te6edf3osTff7b72.Td2a8ffunlinkTb4b4b4(Te6edf3sourcelistpathTb4b4b4)
Te6edf3osTff7b72.Td2a8ffrenameTb4b4b4(Te6edf3tmppathTb4b4b4, Te6edf3sourcelistpathTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffError while persisting blackhole list from Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3remote_identityTff7b72.Td2a8ffhashTb4b4b4)Tffd700}Ta5d6ff: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)

Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffBlackhole list update from Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3remote_identityTff7b72.Td2a8ffhashTb4b4b4)Tffd700}Ta5d6ff completedTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)

Tff7b72def Td2a8ffjobTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(Tff7b72selfTff7b72.Td2a8ffINITIAL_WAITTb4b4b4)
Tff7b72while Tff7b72selfTff7b72.Td2a8ffshould_runTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3now Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72for Te6edf3identity_hash Tff7b72in Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffblackhole_sourcesTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3identity_hash Tff7b72in Tff7b72selfTff7b72.Td2a8fflast_updatesTb4b4b4: Te6edf3last_update Tff7b72= Tff7b72selfTff7b72.Td2a8fflast_updatesTb4b4b4[Te6edf3identity_hashTb4b4b4]
Tff7b72elseTb4b4b4: Te6edf3last_update Tff7b72= T79c0ff0

Tff7b72if Te6edf3now Tff7b72> Te6edf3last_updateTff7b72+Tff7b72selfTff7b72.Td2a8ffUPDATE_INTERVALTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3destination_hash Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffhash_from_name_and_identityTb4b4b4(Ta5d6ff"Ta5d6ffrnstransport.info.blackholeTa5d6ff"Tb4b4b4, Te6edf3identity_hashTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffAttempting blackhole list update from Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3identity_hashTb4b4b4)Tffd700}Ta5d6ff...Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72if Tff7b72not Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffawait_pathTb4b4b4(Te6edf3destination_hashTb4b4b4)Tb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffNo path available for blackhole list update from Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3identity_hashTb4b4b4)Tffd700}Ta5d6ff, retrying laterTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_VERBOSETb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3remote_identity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffrecallTb4b4b4(Te6edf3destination_hashTb4b4b4)
Te6edf3destination Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTb4b4b4(Te6edf3remote_identityTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffOUTTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffSINGLETb4b4b4, Ta5d6ff"Ta5d6ffrnstransportTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffinfoTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffblackholeTa5d6ff"Tb4b4b4)
Te6edf3RNSTff7b72.Td2a8ffLinkTb4b4b4(Te6edf3destinationTb4b4b4, Te6edf3established_callbackTff7b72=Tff7b72selfTff7b72.Td2a8ffupdate_link_establishedTb4b4b4)
Tff7b72selfTff7b72.Td2a8fflast_updatesTb4b4b4[Te6edf3identity_hashTb4b4b4] Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)

Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffError while establishing link for blackhole list update from Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3identity_hashTb4b4b4)Tffd700}Ta5d6ff: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)

Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffError in blackhole list updater job: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fftrace_exceptionTb4b4b4(Te6edf3eTb4b4b4)

Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(Tff7b72selfTff7b72.Td2a8ffjob_intervalTb4b4b4)

Tff7b72def Td2a8ffis_ip_addressTb4b4b4(Te6edf3address_stringTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3ipaddressTff7b72.Td2a8ffip_addressTb4b4b4(Te6edf3address_stringTb4b4b4)
Tff7b72return Tff7b72True
Tff7b72exceptTb4b4b4: Tff7b72return Tff7b72False

Tff7b72def Td2a8ffis_hostnameTb4b4b4(Te6edf3hostnameTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3hostnameTb4b4b4[Tff7b72-T79c0ff1Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ff.Ta5d6ff"Tb4b4b4: Te6edf3hostname Tff7b72= Te6edf3hostnameTb4b4b4[Tb4b4b4:Tff7b72-T79c0ff1Tb4b4b4]
Tff7b72if Tffa657lenTb4b4b4(Te6edf3hostnameTb4b4b4) Tff7b72> T79c0ff253Tb4b4b4: Tff7b72return Tff7b72False
Te6edf3components Tff7b72= Te6edf3hostnameTff7b72.Td2a8ffsplitTb4b4b4(Ta5d6ff"Ta5d6ff.Ta5d6ff"Tb4b4b4)
Tff7b72if Te6edf3reTff7b72.Td2a8ffmatchTb4b4b4(Ta5d6ffrTa5d6ff"Ta5d6ff[0-9]+$Ta5d6ff"Tb4b4b4, Te6edf3componentsTb4b4b4[Tff7b72-T79c0ff1Tb4b4b4]Tb4b4b4)Tb4b4b4: Tff7b72return Tff7b72False
Te6edf3allowed Tff7b72= Te6edf3reTff7b72.Td2a8ffcompileTb4b4b4(Ta5d6ffrTa5d6ff"Ta5d6ff(?!-)[a-z0-9-]Ta5d6ff{Ta5d6ff1,63}(?<!-)$Ta5d6ff"Tb4b4b4, Te6edf3reTff7b72.Td2a8ffIGNORECASETb4b4b4)
Tff7b72return Tffa657allTb4b4b4(Te6edf3allowedTff7b72.Td2a8ffmatchTb4b4b4(Te6edf3labelTb4b4b4) Tff7b72for Te6edf3label Tff7b72in Te6edf3componentsTb4b4b4)


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────